home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 302.adf / TurboMandel / source / TurboAsm.asm < prev    next >
Assembly Source File  |  1990-01-15  |  5KB  |  288 lines

  1. ***********************************
  2. * TurboMandel Assembler Functions *
  3. ***********************************
  4.  
  5.     CSECT data
  6.  
  7.     XREF _GfxBase
  8.     XREF _MathTransBase
  9.    XREF _MathBase
  10.     XREF _CycleOn
  11.     XREF _CurrSpeed
  12.     XREF _CycleLeft
  13.     XREF _Palette
  14.     XREF _Manvp
  15.     XREF _CycleSpeed
  16.     XREF _toppos
  17.  
  18.    CSECT text
  19.  
  20.    XREF _LVOWaitTOF
  21.    XREF _LVOSPMul
  22.    XREF _LVOSPAdd
  23.    XREF _LVOSPSub
  24.    XREF _LVOSPCmp
  25.    XREF _LVOSPTieee
  26.    XREF _LVOSPFieee
  27.     XREF _LVOLoadRGB4
  28.     XREF _CXV45
  29.     XREF _CXV54
  30.  
  31.    XDEF _F2I
  32.    XDEF _I2F
  33.     XDEF _Int32Mand_asm
  34.     XDEF _FloatMand_asm
  35.     XDEF _DoCycle_asm
  36.     XDEF _PaletteLeft
  37.     XDEF _PaletteRight
  38.  
  39. *    Int32Mand_asm (long,long,LONG);
  40. *                 A0   A1   D0
  41.  
  42. _Int32Mand_asm:
  43.    movem.l d2-d7/a2-a6,-(a7)
  44.     move.l d0,d3
  45.    moveq #0,d4            ; q1 = 0
  46.    moveq #0,d5            ; q2 = 0
  47.    moveq #0,d6            ; x  = 0
  48.    moveq #0,d7            ; y  = 0
  49.    subq.w #1,d3
  50. mandelloop2:
  51.    move.l d6,d1           ; D1 = oldx;
  52.    move.l d4,d6
  53.    sub.l d5,d6
  54.    add.l a0,d6            ; x(D6) = q1(D4) - q2(D5) + acoo(A0);
  55.    move.l d1,d2
  56.    bpl.s Pos1
  57.    neg.l d1
  58. Pos1:
  59.    eor.l d7,d2
  60.    tst.l d7
  61.    bpl.s Pos2
  62.    neg.l d7
  63. Pos2:
  64.    move.l d1,d0
  65.    swap d0
  66.    move.w d0,d2
  67.    mulu d7,d0
  68.    clr.w d0
  69.    swap d0
  70.    swap d7
  71.    mulu d7,d1
  72.    clr.w d1
  73.    swap d1
  74.    mulu d2,d7
  75.    add.l d0,d7
  76.    add.l d1,d7
  77.    tst.l d2
  78.    bpl.s Pos3
  79.    neg.l d7
  80. Pos3:
  81.    moveq #6,d0
  82.    asl.l d0,d7
  83.    add.l a1,d7            ; y(D7) = 2 * oldx(D1) * y(D7) + bcoo(A1);
  84.    moveq #5,d0
  85.    move.l d7,d5
  86.    bpl.s Pos4
  87.    neg.l d5
  88. Pos4:
  89.    move.l d5,d2
  90.    swap d5
  91.    mulu d5,d2
  92.    clr.w d2
  93.    swap d2
  94.    mulu d5,d5
  95.    add.l d2,d5
  96.    add.l d2,d5
  97.    asl.l d0,d5            ; q2(D4) = y(D7)^2;
  98.    bvs.s mandelexit
  99.    move.l d6,d4
  100.    bpl.s Pos5
  101.    neg.l d4
  102. Pos5:
  103.    move.l d4,d2
  104.    swap d4
  105.    mulu d4,d2
  106.    clr.w d2
  107.    swap d2
  108.    mulu d4,d4
  109.    add.l d2,d4
  110.    add.l d2,d4
  111.    asl.l d0,d4            ; q1(D4) = x(D6)^2;
  112.    bvs.s mandelexit
  113.    move.l d4,d0
  114.    add.l d5,d0
  115.    bvs.s mandelexit
  116.    cmp.l #536870912,d0
  117.    bgt.s mandelexit
  118.    dbf d3,mandelloop2
  119.    moveq #1,d3
  120. mandelexit:
  121.    subq.w #1,d3
  122.    move.l d3,d0
  123.    movem.l (a7)+,d2-d7/a2-a6
  124.     rts
  125.  
  126. * LONG __asm FloatMand_asm (float,float,LONG);
  127. * D0                        A0    A1    D0
  128.  
  129. _FloatMand_asm:
  130.    movem.l d2-d7/a2-a6,-(a7)         ; /* Calculate iteration of point */
  131.     move.l a0,_acoo
  132.     move.l a1,_bcoo
  133.     move.l d0,d3
  134.    move.l _MathBase(a4),a6
  135.    moveq #0,d4            ; q1
  136.    moveq #0,d5            ; q2
  137.    moveq #0,d6            ; x
  138.    moveq #0,d7            ; y
  139.    subq.w #1,d3
  140. mandelloop:
  141.    move.l d4,d0
  142.    move.l d5,d1
  143.    jsr _LVOSPSub(a6)      ; d0 = q1 - q2;
  144.    move.l _acoo(PC),d1
  145.    jsr _LVOSPAdd(a6)
  146.    move.l d6,d1           ; lastx = x
  147.    move.l d0,d6           ; x = q1 - q2 + a;
  148.    move.l d7,d0
  149.    jsr _LVOSPMul(a6)      ; d0 = lastx * y;
  150.    addq.b #1,d0           ;   move.l   d0,d1 
  151.                           ;   jsr      _LVOSPAdd(a6)   ; d0 = 2 * lastx * y;
  152.    move.l _bcoo(PC),d1
  153.    jsr _LVOSPAdd(a6)
  154.    move.l d0,d7           ; y = 2 * lastx * y + b;
  155.    move.l d0,d1
  156.    jsr _LVOSPMul(a6)      ; q2 = y * y;
  157.    move.l d0,d5
  158.    move.l d6,d0           ; d0 = x;
  159.    move.l d0,d1
  160.    jsr _LVOSPMul(a6)      ; q1 = x * x;
  161.    move.l d0,d4
  162.    move.l d5,d1
  163.    jsr _LVOSPAdd(a6)      ; d0 = q1 + q2;
  164.    move.l #$80000043,d1
  165.    jsr _LVOSPCmp(a6)
  166.    bgt.s leavemandel      ; if (q1 + q2 > 4.0) goto leavemandel;
  167.    dbf d3,mandelloop
  168.    moveq #1,d3
  169. leavemandel:
  170.    subq.w #1,d3
  171.    move.l d3,d0
  172.    movem.l (a7)+,d2-d7/a2-a6
  173.     rts
  174.  
  175. _acoo:    dc.l 0
  176. _bcoo:    dc.l 0
  177.  
  178. * void DoCycle_asm
  179.  
  180. _DoCycle_asm:
  181. Forever:
  182.     move.l _GfxBase(a4),a6
  183.    jsr _LVOWaitTOF(a6)
  184.    move.w _CycleOn(a4),d0
  185.    beq ExitCycle
  186. CyclePalette:
  187.    move.w _CurrSpeed(a4),d0
  188.    subq.w #1,d0
  189.    bne.s NoCycle
  190.    tst.w _CycleLeft(a4)
  191.    beq.s CycleRight
  192.    bsr.s PaletteLeft
  193.    bra.s SetColors
  194. CycleRight:
  195.    bsr.s PaletteRight
  196. SetColors:
  197.    lea _Palette(a4),a1
  198.    move.l _Manvp(a4),a0
  199.     moveq #32,d0
  200.     move.l _GfxBase(a4),a6
  201.    jsr _LVOLoadRGB4(a6)
  202.    move.w _CycleSpeed(a4),d0
  203. NoCycle:
  204.    move.w d0,_CurrSpeed(a4)
  205.    bra.s Forever
  206. PaletteLeft:
  207.    lea _Palette(a4),a1
  208.    move.w 8(a1),d2
  209.    move.w #8,d3
  210.    moveq #26,d7
  211. CycleLoop:
  212.    move.w 2(a1,d3.l),0(a1,d3.l)
  213.    addq.l #2,d3
  214.    dbf d7,CycleLoop
  215.    move.w d2,62(a1)
  216.    lea _toppos(a4),a1
  217.    moveq #2,d7
  218. TopLeft:
  219.    move.w (a1),d0
  220.    subq.w #1,d0
  221.    cmp.w #3,d0
  222.    bne.s Ok2
  223.    moveq #31,d0
  224. Ok2:
  225.    move.w d0,(a1)+
  226.    dbf d7,TopLeft
  227.    rts
  228. PaletteRight:
  229.    lea _Palette(a4),a1
  230.    move.w 62(a1),d2
  231.    move.w #62,d3
  232.    moveq #26,d7
  233. CycleLoop2:
  234.    move.w -2(a1,d3.l),0(a1,d3.l)
  235.    subq.l #2,d3
  236.    dbf d7,CycleLoop2
  237.    move.w d2,8(a1)
  238.    lea _toppos(a4),a1
  239.    moveq #2,d7
  240. TopRight:
  241.    move.w (a1),d0
  242.    addq.w #1,d0
  243.    cmp.w #32,d0
  244.    bne.s Ok1
  245.    moveq #4,d0
  246. Ok1:
  247.    move.w d0,(a1)+
  248.    dbf d7,TopRight
  249. ExitCycle:
  250.    rts
  251.  
  252. _PaletteLeft:
  253.     movem.l d2/d3/d7/a1,-(a7)
  254.     jsr PaletteLeft
  255.     movem.l (a7)+,d2/d3/d7/a1
  256.     rts
  257.  
  258. _PaletteRight:
  259.     movem.l d2/d3/d7/a1,-(a7)
  260.     jsr PaletteRight
  261.     movem.l (a7)+,d2/d3/d7/a1
  262.     rts
  263.  
  264. * FFP-IEEE conversions *
  265.  
  266. * void F2I (ULONG *ieee,float getal)
  267. *              A0          D0
  268. _F2I:
  269.     move.l a3,-(a7)
  270.     move.l a0,a3
  271.     movea.l _MathTransBase(a4),a6
  272.     jsr _LVOSPTieee(a6)
  273.     jsr _CXV45(PC)                                ; convert single ieee to double ieee
  274.     movem.l d0-d1,(a3)
  275.     movea.l (a7)+,a3
  276.     rts
  277.  
  278. * float I2F (ULONG *ieee)
  279. * D0         A0
  280. _I2F:
  281.     movem.l (a0),d0-d1
  282.     jsr _CXV54(PC)                                ; convert double ieee to single ieee
  283.     movea.l   _MathTransBase(a4),a6
  284.     jsr       _LVOSPFieee(a6)
  285.     rts    
  286.  
  287.     END
  288.